package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository是Spring家族对持久层包名\类名\接口名的规范
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // ItemRepository接口要继承SpringData框架提供的父接口ElasticsearchRepository
    // 一旦继承,当前接口就可以编写使用父接口中提供的连接ES的方法了
    // 继承父接口后,SpringData会根据我们在泛型中指定的Item实体类,找到对应的索引
    // 并生成操作这个索引的基本增删改查方法,我们自己无需编写
    // ElasticsearchRepository<[要操作的实体类名称],[实体类主键的类型]>


    // SpringData自定义查询
    // 我们要编写遵循SpringData给定的格式的方法名
    // SpringData会根据方法名自动推断出查询意图,生成能够完成该查询的语句
    // query(查询):表达当前的方法是一个查询方法,类似sql语句中的select
    // Item/Items:是要查询的实体类名称,返回集合的查询应该带s
    // By(通过\根据):标识开始设置查询条件的关键字,等价于sql语句中的where
    // Title:要查询的字段,可以是Item实体类中的任何字段
    // Matches(匹配):执行查询的条件,Matches是查询匹配字符串的关键字,类似于sql语句中的like
    Iterable<Item> queryItemsByTitleMatches(String title);


    //自定义多条件查询
    //多个条件之间要使用and或or来分隔，表示多个条件之间的逻辑关系
    //下面使用title和brand字段进行多条件查询
    //多个条件是，方法名要按照规则编写多个条件，参数也要对应条件数量来变化
    //声明的参数会按照顺序依次赋值到需要值得条件中和参数命无关
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);


    //排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title,String brand);


    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);

}
